package com.shuma.common.exception;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotRoleException;
import com.shuma.common.vo.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 接口异常统一处理、数据预处理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 所有异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public R exceptionHandler(Exception e) throws Exception {
        LOG.error("系统异常：", e);
        return R.fail(500, "系统出现异常，请联系管理员");
    }

    /**
     * 业务异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public R exceptionHandler(BusinessException e) {
        LOG.error("业务异常：{}", e.getE().getDesc());
        return R.fail(403, e.getE().getDesc());
    }

    /**
     * 校验异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public R exceptionHandler(BindException e) {
        String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        LOG.error("校验异常：{}", message);
        // 参数无效1001
        return R.fail(1001, message);
    }

    /**
     * 未登录异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = NotLoginException.class)
    @ResponseBody
    public R exceptionHandler(NotLoginException e) {
        LOG.error("登录异常：{}", "未登录");
        // 2001 未登录
        return R.fail(2001, "未登录！");
    }

    /**
     * 无权限异常统一处理
     * @param e
     * @return
     */
    @ExceptionHandler(value = NotRoleException.class)
    @ResponseBody
    public R exceptionHandler(NotRoleException e) {
        LOG.error("权限异常：{}", "无权限");
        return R.fail(403, "没有对应权限！");
    }

}
